package desmontec.relatorios.dto;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import desmontec.documentos.DPG;
import desmontec.documentos.GuiaDeTrafego;
import desmontec.documentos.MapaEstocagem;
import desmontec.util.Constantes;
import desmontec.util.Funcoes;

public class RelatorioMapaEstocagemDTO {
	
	private char letra;
	
	public RelatorioMapaEstocagemDTO(){
		this.letra = 'a';
	}
	
	
	public RelatorioMapaEstocagemDTO(DPG dpg, MapaEstocagem mapa, List<GuiaDeTrafego> guias){
		this.letra = 'a';
		// seta dados da DPG
		this.setBeneficiario(dpg.getBeneficiario());
		this.setNumeroDPG(dpg.getNumero());
		
		// seta dados do mapa
		this.setCompetencia(mapa.getCompetencia());
		this.setNumeroCertificado(mapa.getNumeroDoCertificado());
		
		// seta dados das guias
		if (guias != null && !guias.isEmpty()){
			for (GuiaDeTrafego guiaDeTrafego : guias) {
				GuiaDeTrafegoDTO guiaDTO = new GuiaDeTrafegoDTO(guiaDeTrafego);
				this.addGuiaDTO(guiaDTO);
			}
		}
		
	}
	
	// dados da DPG
	private String beneficiario;
	private Integer numeroDPG;
	
	// dados do ME
	private Integer numeroCertificado;	
	private Date competencia;
	
	private List<GuiaDeTrafegoDTO> guias;

	public String getBeneficiario() {
		return beneficiario;
	}

	public void setBeneficiario(String beneficiario) {
		this.beneficiario = beneficiario;
	}

	public Integer getNumeroDPG() {
		return numeroDPG;
	}

	public void setNumeroDPG(Integer numeroDPG) {
		this.numeroDPG = numeroDPG;
	}

	public Integer getNumeroCertificado() {
		return numeroCertificado;
	}

	public void setNumeroCertificado(Integer numeroCertificado) {
		this.numeroCertificado = numeroCertificado;
	}

	public Date getCompetencia() {
		return competencia;
	}

	public void setCompetencia(Date competencia) {
		this.competencia = competencia;
	}

	public List<GuiaDeTrafegoDTO> getGuias() {
		return guias;
	}

	public void setGuias(List<GuiaDeTrafegoDTO> guias) {
		this.guias = guias;
	}

	public void addGuiaDTO(GuiaDeTrafegoDTO guiaDTO) {
		if(guias == null){
			guias = new ArrayList<GuiaDeTrafegoDTO>();
		}
		// adiciona a referenciqa
		guiaDTO.setReferencia(String.valueOf(letra));
		letra++;
		// adiciona a guia
		guias.add(guiaDTO);
	}

	
	public String toString(){
		StringBuffer out = new StringBuffer();
		out.append(beneficiario);
		out.append(Constantes.UNDERLINE);
		out.append(Funcoes.getCompetencia(competencia, true));
		out.append(Constantes.LINHA);
		if(guias != null){
			if(!guias.isEmpty()){
				for (GuiaDeTrafegoDTO guia : guias) {
					out.append(Constantes.LINHA);
					out.append(guia.toString());
				}
			}
		}
		
		return out.toString();
	}

	public Map<Integer, List<MaterialGuiaDTO>> getMapaMateriaisGuias() {
		
		if (guias != null && !guias.isEmpty()){
			
			Map<Integer, List<MaterialGuiaDTO>> mapa = new HashMap<Integer, List<MaterialGuiaDTO>>();
			// inicializando o mapa
			mapa.put(Constantes.MAP_MATERIAL_DINAMITE, new ArrayList<MaterialGuiaDTO>());
			mapa.put(Constantes.MAP_MATERIAL_ESPOLETAS, new ArrayList<MaterialGuiaDTO>());
			mapa.put(Constantes.MAP_MATERIAL_ESTOPINS, new ArrayList<MaterialGuiaDTO>());
			mapa.put(Constantes.MAP_MATERIAL_CORDEL, new ArrayList<MaterialGuiaDTO>());
			mapa.put(Constantes.MAP_MATERIAL_ESPOLETIM, new ArrayList<MaterialGuiaDTO>());
			mapa.put(Constantes.MAP_MATERIAL_RETARDOS, new ArrayList<MaterialGuiaDTO>());
			
			for (GuiaDeTrafegoDTO guia: guias) {
				StringBuffer referencia = new StringBuffer();
				referencia.append(Constantes.PARENTESES_ESQUERDO);
				referencia.append(guia.getReferencia());
				referencia.append(Constantes.PARENTESES_DIREITO);
				
				
				mapa.get(Constantes.MAP_MATERIAL_DINAMITE).add(new MaterialGuiaDTO(guia.getDinamite(), referencia.toString()));
				mapa.get(Constantes.MAP_MATERIAL_ESPOLETAS).add(new MaterialGuiaDTO(guia.getEspoleta(), referencia.toString()));
				mapa.get(Constantes.MAP_MATERIAL_ESTOPINS).add(new MaterialGuiaDTO(guia.getEstopim(), referencia.toString()));
				mapa.get(Constantes.MAP_MATERIAL_CORDEL).add(new MaterialGuiaDTO(guia.getCordelDet(), referencia.toString()));
				mapa.get(Constantes.MAP_MATERIAL_ESPOLETIM).add(new MaterialGuiaDTO(guia.getEspoletim(), referencia.toString()));
				mapa.get(Constantes.MAP_MATERIAL_RETARDOS).add(new MaterialGuiaDTO(guia.getRetardo(), referencia.toString()));
				
			}
			
			return mapa;
		}
		
		return null;
	}
	
	
	private String localData;

	public String getLocalData() {
		return localData;
	}


	public void setLocalData(String localData) {
		this.localData = localData;
	}
	
	
	
}
